﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using Newtonsoft.Json;


namespace 多协议通信平台.Common
{
    public static class CommonHelper
    {
        // 浅拷贝（Shallow Copy）
        public static T ShallowCopy<T>(T source) where T : class
        {
            if (source == null)
                throw new ArgumentNullException(nameof(source), "Source object cannot be null.");

            // 对于实现了 ICloneable 接口的对象，直接调用 Clone 方法
            if (source is ICloneable cloneable)
                return (T)cloneable.Clone();

            // 对于集合类型（如 List<T>、数组等），创建新实例并复制元素
            if (source is IEnumerable enumerable)
            {
                if (source is IList list)
                {
                    var newList = (IList)Activator.CreateInstance(list.GetType());
                    foreach (var item in list)
                        newList.Add(item);
                    return (T)newList;
                }

                if (source is Array array)
                {
                    var newArray = (Array)array.Clone();
                    return (T)(object)newArray;
                }
            }

            // 默认情况：直接返回引用（严格来说不是拷贝，但符合浅拷贝语义）
            return source;
        }

        // 深拷贝（Deep Copy） - 通过序列化实现
        public static T DeepCopy2<T>(T source)
        {
            if (source == null)
                throw new ArgumentNullException(nameof(source), "Source object cannot be null.");

            // 对于字符串、值类型等不可变对象，直接返回
            if (source is ValueType || source is string)
                return source;

            // 使用二进制序列化实现深拷贝
            using (var memoryStream = new MemoryStream())
            {
                IFormatter formatter = new BinaryFormatter();
                formatter.Serialize(memoryStream, source);
                memoryStream.Seek(0, SeekOrigin.Begin);
                return (T)formatter.Deserialize(memoryStream);
            }
        }

        // 深拷贝（Deep Copy） 使用 Newtonsoft.Json
        public static T DeepCopy<T>(T source) 
        {
            return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(source));
        }
    }
}
